-- 从第二个键中获取输入字符串
local inputString = KEYS[2]
-- 初始化实际的键为输入字符串
local actualKey = inputString
-- 查找字符串中的冒号索引
local colonIndex = string.find(actualKey, ":")
-- 如果找到了冒号，則提取冒号后面的部分作为实际键
if colonIndex ~= nil then
    actualKey = string.sub(actualKey, colonIndex + 1)
end

-- 获取传入的JSON数组字符串
local jsonArrayStr = ARGV[1]
-- 解析JSON数组字符串为Lua表
local jsonArray = cjson.decode(jsonArrayStr)
-- 获取同行的JSON数组字符串
local alongJsonArrayStr = ARGV[2]
-- 解析同行的JSON数组字符串为Lua表
local alongJsonArray = cjson.decode(alongJsonArrayStr)

-- 遍历解析后的JSON数组
for index, jsonObj in ipairs(jsonArray) do
    -- 将座位类型转换为数字
    local seatType = tonumber(jsonObj.seatType)
    -- 将数量转换为数字
    local count = tonumber(jsonObj.count)
    -- 遍历同行的JSON数组
    for indexTwo, alongJsonObj in ipairs(alongJsonArray) do
        -- 将起始车站转换为字符串
        local startStation = tostring(alongJsonObj.startStation)
        -- 将结束车站转换为字符串
        local endStation = tostring(alongJsonObj.endStation)
        -- 构建实际的内部Hash键
        local actualInnerHashKey = startStation .. "_" .. endStation .. "_" .. seatType
        -- 从Redis中获取指定键和实际内部Hash键对应的座位可用性令牌值，并转换为数字
        local ticketSeatAvailabilityTokenValue = tonumber(redis.call('hget', KEYS[1], tostring(actualInnerHashKey)))
        -- 如果座位可用性令牌值大于等于0，则增加对应数量的座位
        if ticketSeatAvailabilityTokenValue >= 0 then
            redis.call('hincrby', KEYS[1], tostring(actualInnerHashKey), count)
        end
    end
end

-- 返回0表示执行成功
return 0

